package cn.tedu.csmall.product.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.io.Serializable;

/**
 * csmall-server-jh
 * <p>
 * Redis的配置类，主要在Spring容器中创建了RedisTemplate对象，用来操作Redis数据库
 *
 * @author: 姜衡
 * @create: 2024-10-11 10:35
 **/

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String, Serializable> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
        // 配置Spring自带的redis连接工厂，相当于MySQL的dataSource
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 因为生产环境中程序服务器和redis服务器是分开的，访问时是通过2进制在网络中传输的，
        // 就像前后端互联间的数据传输，数据类型就会丢失，导致无法还原，就需要用到序列化和反序列化，
        // 因为之前已经规定了Redis的KEY要用String类型，所以用序列化器的string()方法设置KEY值
        redisTemplate.setKeySerializer(RedisSerializer.string());
        // 因为往Redis种存的数据多种多样，这里设置Value时要用序列化器的json()方法，可以还原原来的类型
        redisTemplate.setValueSerializer(RedisSerializer.json());
        // 最后将创建好的对象返回，用来操作Redis数据库
        return redisTemplate;
    }
}
